# encoding: UTF-8
'''
Created: 2014-05-13 16:50

@author: VAN
'''
'''
u.encode(),s.decode()
                  encode
unicode -------------------------> str
unicode <--------------------------str
                  decode

对unicode进行解码是错误的,对str进行编码也是错误的

最好使用unicode，放弃str,unicode常常作为不同编码间转换的中间层临时编码
'''

u = u'编码'
print repr(u)

s = u.encode('utf-8')
print repr(s)

u2 = s.decode('utf-8')
print repr(u2)

'''
内置的open()方法打开文件时，read()读取的是str，读取后需要使用正确的编码格式进行decode()。
write()写入时，如果参数是unicode，则需要使用你希望写入的编码进行encode()，如果是其他编码格式的str，则需要先用该str的编码进行decode()，转成unicode后再使用写入的编码进行encode()。
如果直接将unicode作为参数传入write()方法，Python将先使用源代码文件声明的字符编码进行编码然后写入
'''
def file_func():
    fin = "tmp.in"
    fout = "tmp.out"
    fr = open (fin, "r")
    fw = open(fout, "a")
    for line in fr:
        print type(line)
        print repr(line);
        u = line.decode('utf-8')
        fw.write(u.encode('GBK'))
        print type(u)
        print repr(u)

    fr.close()
    fw.close()


'''
模块codecs提供了一个open()方法，可以指定一个编码打开文件，使用这个方法打开的文件读取返回的将是unicode。
写入时，如果参数是unicode，则使用open()时指定的编码进行编码后写入；
如果是str，则先根据源代码文件声明的字符编码，解码成unicode后再进行前述操作
'''
def f_func():
    import codecs
    fin = "tmp.in"
    fout = "tmp.out" 
    fr = codecs.open(fin, encoding='utf-8')
    fw = codecs.open(fout,'a',encoding='utf-8')
    for line in fr:
        print type(line)
        print repr(line);
        fw.write(line)

    fr.close()
    fw.close()

f_func()

